home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GEM / VDIINPUT.I < prev    next >
Encoding:
Modula Implementation  |  1993-12-10  |  27.3 KB  |  898 lines

  1. IMPLEMENTATION MODULE VDIInputs;
  2. (*$L-, N+, Y+*)
  3.  
  4.  
  5. (*  MEGAMAX MODULA 2 GEM-Library :  Die VDI Eingabefunktionen
  6.  *
  7.  *  Autor: Manuel Chakravarty           Erstellt :  04.11.87
  8.  *
  9.  *  Version   2.2     V#0039
  10.  *)
  11.  
  12. (*  04.11.87    | Übernahme aus 'GEMBase' und 'GEMExt'
  13.  *  27.12.87    | Vector-Handler arbeiten im Usermode
  14.  *                'setInputMode' arbeitet lokal zum aktuellen device
  15.  *  14.6.88     | 'GetMouseState' behandelt das 'MButtonSet' mit .B
  16.  *  01.02.90    | Anpassung auf Compiler V4.0 (verdrehte SET's)
  17.  *  02.04.90    | Anpassung auf public arrays
  18.  *  25.02.91 TT | "error"-Setzung über occured-Funktion
  19.  *  15.09.91 MS | KeyboardState korrigiert
  20.  *  14.07.93 TT | ButChg/MouseMove/Timer-IR-Routinen korrigiert (SSP wird nun
  21.  *                ebenfalls gerettet/restauriert).
  22.  *)
  23.  
  24.  
  25. FROM    SYSTEM          IMPORT ASSEMBLER, WORD, LONGWORD;
  26.  
  27. FROM    MOSGlobals      IMPORT MemArea;
  28.  
  29. FROM    GrafBase        IMPORT Point, Rectangle, PtrMouseFormDef;
  30.  
  31. FROM    GEMGlobals      IMPORT GemChar, MButtonSet, SpecialKeySet;
  32.  
  33. IMPORT  GEMShare;
  34.  
  35. FROM    GEMEnv          IMPORT DeviceHandle;
  36.  
  37. (*$I GEMOPS.ICL *)
  38.  
  39.  
  40. (*  setInputMode -- Legt das logische Eingabegerät und dessen Eingabe-  *
  41.  *                  modus fest. Der Aufruf wird nur ausgeführt, wenn    *
  42.  *                  die zu setzende Einstellung sich von der momentanen *
  43.  *                  Einstellung unterscheidet. !! 'GemError' beachten!! *)
  44.  
  45. PROCEDURE setInputMode (handle:DeviceHandle; dev:logInpDev;mode:inputMode);
  46.  
  47. BEGIN
  48.   ASSEMBLER
  49.         MOVE.L  -8(A3),(A3)+
  50.         SUBQ.L  #2,A7
  51.         MOVE.L  A7,(A3)+
  52.         JSR     setDevice
  53.         TST.W   -(A7)
  54.         BNE     cont2
  55.         SUBQ.L  #8,A3
  56.         BRA     ende
  57.         
  58. cont2
  59.         MOVE.W  -(A3),D0                ; 'mode' -> D0
  60.         MOVE.W  -(A3),D2                ; 'dev' -> D2
  61.         MOVE.W  D2,D1
  62.         ADD.W   D1,D1
  63.         MOVE.L  -4(A3),A0
  64.         LEA     device.curInpMode(A0),A0
  65.         ADDA.W  D1,A0
  66.         CMP.W   (A0),D0                 ; handle^.curInpMode [dev] = mode
  67.         BEQ     cont                    ; branch if equal
  68.         
  69.         MOVE.W  D0,-(A7)                ; Für späteren Test
  70.         MOVE.L  A0,-(A7)
  71.         
  72.         MOVE.L  pubs,A0
  73.         MOVE.W  D1,pubArrays.vINTIN(A0)
  74.         MOVE.W  D0,pubArrays.vINTIN+2(A0)
  75.         MOVE.W  D0,-(A7)
  76.         MOVE.W  #SET_INPUT_MODE,(A3)+
  77.         CLR.W   (A3)+
  78.         JSR     vdi_if
  79.         
  80.         MOVE.L  pubs,A0
  81.         MOVE.W  pubArrays.vINTOUT(A0),D0
  82.         MOVE.L  (A7)+,A0
  83.         MOVE.W  D0,(A0)
  84.         CMP.W   (A7)+,D0
  85.         BEQ     ende
  86.         JSR     gemErrorOccured
  87.         BRA     ende
  88. cont
  89.         ADDQ.L  #6,A3
  90. ende
  91.   END;
  92. END setInputMode;
  93.  
  94. PROCEDURE RequestLoc(handle:DeviceHandle; start:Point;
  95.                      VAR termbut:CHAR;VAR loc:Point);
  96.  
  97. BEGIN
  98.   ASSEMBLER
  99.         MOVE.L  -16(A3),(A3)+
  100.         MOVE.W  #location,(A3)+
  101.         MOVE.W  #request,(A3)+
  102.         JSR     setInputMode
  103.         TST.W   error
  104.         BNE     err
  105.         
  106.         MOVE.L  -(A3),-(A7)
  107.         MOVE.L  -(A3),-(A7)
  108.         MOVE.L  pubs,A0
  109.         MOVE.L  -(A3),pubArrays.PTSIN(A0)
  110.         MOVE.W  #INPUT_LOCATOR,(A3)+
  111.         CLR.W   (A3)+
  112.         JSR     vdi_if
  113.         MOVE.L  (A7)+,A1
  114.         MOVE.L  pubs,A0
  115.         MOVE.B  pubArrays.vINTOUT+1(A0),(A1)
  116.         MOVE.L  (A7)+,A1                ; ADR(loc) -> A1
  117.         MOVE.L  pubArrays.PTSOUT(A0),(A1)
  118.         BRA     ende
  119.         
  120. err
  121.         SUBA.W  #16,A3
  122. ende
  123.   END;
  124. END RequestLoc;
  125.  
  126. PROCEDURE TestLoc(handle:DeviceHandle; start:Point;
  127.                   VAR termbut:CHAR;VAR keyPress,koorChange:BOOLEAN;
  128.                   VAR loc:Point);
  129.                       
  130. BEGIN
  131.   ASSEMBLER
  132.         MOVE.L  -24(A3),(A3)+
  133.         MOVE.W  #location,(A3)+
  134.         MOVE.W  #sample,(A3)+
  135.         JSR     setInputMode
  136.         TST.W   error
  137.         BNE     err
  138.         
  139.         MOVE.L  -(A3),-(A7)
  140.         MOVE.L  -(A3),-(A7)
  141.         MOVE.L  -(A3),-(A7)
  142.         MOVE.L  -(A3),-(A7)
  143.         MOVE.L  pubs,A0
  144.         MOVE.L  -(A3),pubArrays.PTSIN(A0)
  145.         MOVE.W  #INPUT_LOCATOR,(A3)+
  146.         CLR.W   (A3)+
  147.         JSR     vdi_if
  148.         MOVE.L  (A7)+,A1                ; ADR(termbut) -> A1
  149.         MOVE.L  our_cb,A0               ; our_cb -> A0
  150.         TST.W   cb.V_CONTRL.sintout(A0)
  151.         BEQ     noKey                   ; branch if no key pressed
  152.         MOVE.L  pubs, A0
  153.         MOVE.B  pubArrays.vINTOUT+1(A0),(A1)
  154.         MOVE.L  (A7)+,A1
  155.         MOVE.W  #TRUE,(A1)
  156.         BRA     cont1
  157. noKey
  158.         CLR.B   (A1)
  159.         MOVE.L  (A7)+,A1
  160.         CLR.W   (A1)
  161. cont1
  162.         MOVE.L  (A7)+,A1
  163.         MOVE.L  our_cb,A0               ; our_cb -> A0
  164.         TST.W   cb.V_CONTRL.sptsout(A0)
  165.         BEQ     noPnt
  166.         MOVE.L  (A7)+,A2                ; ADR(loc) -> A2
  167.         MOVE.L  pubs, A0
  168.         MOVE.L  pubArrays.PTSOUT(A0),(A2)
  169.         MOVE.W  #TRUE,(A1)
  170.         BRA     ende
  171. noPnt
  172.         MOVE.L  pubArrays.PTSIN(A0),(A2)
  173.         CLR.W   (A1)
  174.         BRA     ende
  175.         
  176. err
  177.         SUBA.W  #24,A3
  178. ende
  179.   END;
  180. END TestLoc;
  181.                       
  182. PROCEDURE RequestValue(handle:DeviceHandle; start:CARDINAL;
  183.                        VAR termbut:CHAR;VAR value:CARDINAL);
  184.  
  185. BEGIN
  186.   ASSEMBLER
  187.         MOVE.L  -14(A3),(A3)+
  188.         MOVE.W  #value,(A3)+
  189.         MOVE.W  #request,(A3)+
  190.         JSR     setInputMode
  191.         TST.W   error
  192.         BNE     ende
  193.         
  194.         MOVE.L  -(A3),-(A7)
  195.         MOVE.L  -(A3),-(A7)
  196.         MOVE.L  pubs,A0
  197.         MOVE.W  -(A3),pubArrays.vINTIN(A0)
  198.         MOVE.W  #INPUT_VALUATOR,(A3)+
  199.         CLR.W   (A3)+
  200.         JSR     vdi_if
  201.         MOVE.L  (A7)+,A1
  202.         MOVE.L  pubs,A0
  203.         MOVE.W  pubArrays.vINTOUT+2(A0),(A1)
  204.         MOVE.L  (A7)+,A1
  205.         MOVE.W  pubArrays.vINTOUT(A0),(A1)
  206.         BRA     ende
  207.         
  208. err
  209.         SUBA.W  #14,A3
  210. ende
  211.   END;
  212. END RequestValue;
  213.  
  214. PROCEDURE TestValue (handle:DeviceHandle; start:CARDINAL;
  215.                      VAR termbut:CHAR; VAR status:TValState;
  216.                      VAR value:CARDINAL);
  217.                    
  218. BEGIN
  219.   ASSEMBLER
  220.         MOVE.L  -18(A3),(A3)+
  221.         MOVE.W  #value,(A3)+
  222.         MOVE.W  #sample,(A3)+
  223.         JSR     setInputMode
  224.         TST.W   error
  225.         BNE     ende
  226.         
  227.         MOVE.L  -(A3),-(A7)
  228.         MOVE.L  -(A3),-(A7)
  229.         MOVE.L  -(A3),-(A7)
  230.         MOVE.L  pubs,A0
  231.         MOVE.W  -(A3),pubArrays.vINTIN(A0)
  232.         MOVE.W  #INPUT_VALUATOR,(A3)+
  233.         CLR.W   (A3)+
  234.         JSR     vdi_if
  235.         MOVE.L  (A7)+,A1
  236.         MOVE.L  our_cb,A0
  237.         MOVE.W  cb.V_CONTRL.sintout(A0),D0
  238.         MOVE.W  D0,(A1)
  239.         MOVE.L  (A7)+,A1
  240.         TST.W   D0
  241.         BNE     aAction
  242.         CLR.W   (A1)
  243.         MOVE.L  (A7)+,A2
  244.         MOVE.L  pubs,A0
  245.         MOVE.W  pubArrays.vINTIN(A0),(A2)
  246.         BRA     ende
  247. aAction
  248.         MOVE.W  pubArrays.vINTOUT(A0),(A2)
  249.         CMP.W   #1,D0
  250.         BNE     both
  251.         CLR.W   (A1)
  252.         BRA     ende
  253. both
  254.         MOVE.W  pubArrays.vINTOUT+2(A0),(A1)
  255.         BRA     ende
  256.         
  257. err
  258.         SUBA.W  #18,A3
  259. ende
  260.   END;
  261. END TestValue;
  262.                    
  263. PROCEDURE RequestChoice(handle:DeviceHandle;start:CARDINAL;VAR choice:CARDINAL);
  264.  
  265. BEGIN
  266.   ASSEMBLER
  267.         MOVE.L  -10(A3),(A3)+
  268.         MOVE.W  #choice,(A3)+
  269.         MOVE.W  #request,(A3)+
  270.         JSR     setInputMode
  271.         TST.W   error
  272.         BNE     ende
  273.         
  274.         MOVE.L  -(A3),-(A7)
  275.         MOVE.L  pubs,A0
  276.         MOVE.W  -(A3),pubArrays.vINTIN(A0)
  277.         
  278.         SUBQ.L  #2,A7
  279.         MOVE.L  A7,(A3)+
  280.         JSR     setDevice
  281.         TST.W   (A7)+
  282.         BEQ     ende
  283.         
  284.         MOVE.L  our_cb,A0
  285.         MOVE.W  #INPUT_CHOICE,cb.V_CONTRL.opcode(A0)
  286.         CLR.W   cb.V_CONTRL.sptsin(A0)
  287.         MOVE.W  #1,cb.V_CONTRL.sintin(A0)
  288.         MOVE.L  cb.CURDEVICE(A0),A1
  289.         MOVE.W  device.handle(A1),cb.V_CONTRL.handle(A0)
  290.         MOVE.L  A0,(A3)+
  291.         JSR     vdi_call
  292.         MOVE.L  pubs,A0
  293.         MOVE.L  (A7)+,A1
  294.         MOVE.W  pubArrays.vINTOUT(A0),(A1)
  295.         BRA     ende
  296.         
  297. err
  298.         SUBA.W  #10,A3
  299. ende
  300.   END;
  301. END RequestChoice;
  302.  
  303. PROCEDURE TestChoice(handle:DeviceHandle;
  304.                      VAR keyPress:BOOLEAN;VAR choice:CARDINAL);
  305.  
  306. BEGIN
  307.   ASSEMBLER
  308.         MOVE.L  -12(A3),(A3)+
  309.         MOVE.W  #choice,(A3)+
  310.         MOVE.W  #sample,(A3)+
  311.         JSR     setInputMode
  312.         TST.W   error
  313.         BNE     err
  314.         
  315.         MOVE.L    -(A3),-(A7)
  316.         MOVE.L    -(A3),-(A7)
  317.         
  318.         SUBQ.L  #2,A7
  319.         MOVE.L  A7,(A3)+
  320.         JSR     setDevice
  321.         TST.W   (A7)+
  322.         BEQ     err2
  323.         
  324.         MOVE.L  our_cb,A0
  325.         MOVE.W  #INPUT_CHOICE,cb.V_CONTRL.opcode(A0)
  326.         CLR.W   cb.V_CONTRL.sptsin(A0)
  327.         MOVE.W  #1,cb.V_CONTRL.sintin(A0)
  328.         MOVE.L  cb.CURDEVICE(A0),A1
  329.         MOVE.W  device.handle(A1),cb.V_CONTRL.handle(A0)
  330.         MOVE.L  A0,(A3)+
  331.         JSR     vdi_call
  332.         MOVE.L  (A7)+,A1
  333.         MOVE.L  our_cb,A0
  334.         MOVE.W  cb.V_CONTRL.sintout(A0),D0
  335.         MOVE.W  D0,(A1)
  336.         MOVE.L  (A7)+,A1
  337.         BEQ     noKey
  338.         MOVE.L  pubs,A0
  339.         MOVE.W  pubArrays.vINTOUT(A0),(A1)
  340.         BRA     ende
  341. noKey
  342.         CLR.W   (A1)
  343.         BRA     ende
  344.         
  345. err
  346.         SUBA.W  #12,A3
  347.         BRA     ende
  348. err2
  349.         ADDQ.L  #4,A7
  350. ende
  351.   END;
  352. END TestChoice;
  353.  
  354.  
  355. PROCEDURE RequestString(handle:DeviceHandle;
  356.                         VAR str:ARRAY OF CHAR; echo:BOOLEAN;echoLoc:Point);
  357.  
  358. END RequestString;
  359.  
  360. PROCEDURE TestString(handle:DeviceHandle;
  361.                      VAR str:ARRAY OF CHAR; echo:BOOLEAN;echoLoc:Point;
  362.                      VAR success:BOOLEAN);
  363.  
  364. END TestString;
  365.  
  366. PROCEDURE RStringCode(handle:DeviceHandle;
  367.                       VAR str:ARRAY OF GemChar; echo:BOOLEAN;echoLoc:Point);
  368.  
  369. END RStringCode;
  370.  
  371. PROCEDURE TStringCode(handle:DeviceHandle;
  372.                       VAR str:ARRAY OF GemChar; echo:BOOLEAN;echoLoc:Point;
  373.                       VAR success:BOOLEAN);
  374.                       
  375. END TStringCode;
  376.  
  377.  
  378. PROCEDURE SetMouseForm(handle:DeviceHandle; newForm:PtrMouseFormDef);
  379.  
  380. BEGIN
  381.   ASSEMBLER
  382.     MOVE.L      our_cb,A0
  383.     MOVE.L      cb.VDIPB.intin(A0),-(A7)
  384.     MOVE.L      -(A3),cb.VDIPB.intin(A0)
  385.     MOVE.W      #SET_MOUSE_FORM,(A3)+
  386.     CLR.W       (A3)+
  387.     JSR         vdi_if
  388.     MOVE.L      our_cb,A0
  389.     MOVE.L      (A7)+,cb.VDIPB.intin(A0)
  390.   END;
  391. END SetMouseForm;
  392.  
  393. PROCEDURE ShowCursor(handle:DeviceHandle;force:BOOLEAN);
  394.  
  395. BEGIN
  396.   ASSEMBLER
  397.         JMP     showCursor      ; Eigentliche Routine anspringen
  398.   END;
  399. END ShowCursor;
  400.  
  401. PROCEDURE HideCursor(handle:DeviceHandle);
  402.  
  403. BEGIN
  404.   ASSEMBLER
  405.         JMP     hideCursor
  406.   END;
  407. END HideCursor;
  408.  
  409. PROCEDURE GetMouseState(    handle  : DeviceHandle;
  410.                         VAR position: Point;
  411.                         VAR buts    : MButtonSet);
  412.  
  413. BEGIN
  414.   ASSEMBLER
  415.         MOVE.L  -(A3),-(A7)
  416.         MOVE.L  -(A3),-(A7)
  417.         MOVE.W  #MOUSE_BUTTONS,(A3)+
  418.         CLR.W   (A3)+
  419.         JSR     vdi_if
  420.         MOVE.L  pubs,A0
  421.         MOVE.L  (A7)+,A1
  422.         MOVE.L  pubArrays.PTSOUT(A0),(A1)
  423.         MOVE.W  pubArrays.vINTOUT(A0),D0
  424.         MOVE.L  (A7)+,A1
  425.         MOVE.B  D0,(A1)
  426.   END;
  427. END GetMouseState;
  428.  
  429.  
  430. PROCEDURE KeyboardState (handle: DeviceHandle): SpecialKeySet;
  431.  
  432. BEGIN
  433.   ASSEMBLER
  434.         MOVE.W  #KEY_STATE,(A3)+
  435.         CLR.W   (A3)+
  436.         JSR     vdi_if
  437.         MOVE.L  pubs,A0
  438.         MOVE.B  pubArrays.vINTOUT+1(A0),(A3)+    (* !MS *)
  439.         ADDQ.L  #1, A3
  440.   END;
  441. END KeyboardState;
  442.  
  443.  
  444. TYPE    regSaveArea     = ARRAY[0..16] OF LONGWORD;
  445.                          
  446. VAR     timerSArea,butChgSArea,msMoveSArea,curChgSArea  : regSaveArea;
  447.         locTemp,locTemp2                                : Point;
  448.         butsTemp                                        : MButtonSet;
  449.         
  450. (*  timerIRHandler -- Wird vom GEM bei jedem Timerinterrupt angesprungen, *
  451.  *                    falls sich eine Userroutine über 'SetTimerVector'   *
  452.  *                    angemeldet hat. Bei jedem Aufruf springt 'timerIR-  *
  453.  *                    Handler' die Elemente der TimerVecList der Reihen-  *
  454.  *                    folge entsprechend, beim Listenanfang beginnend an, *
  455.  *                    bis eine Procedur FALSE als Rückgabe liefert ,oder  *
  456.  *                    das Listenende erreicht ist.                        *)
  457.  
  458. PROCEDURE timerIRHandler;
  459.  
  460. BEGIN
  461.   ASSEMBLER
  462.         MOVE.L  A0,timerSArea
  463.         LEA     timerSArea,A0
  464.         ADDA.W  #68,A0
  465.         MOVEM.L D0-D7/A1-A7,-(A0)
  466.         MOVE.L  USP,A1
  467.         MOVE.L  A1,-(A0)                ; rette USP
  468.         ANDI    #-1-$2000,SR            ; Usermode
  469.         MOVE.L  timerVecList,A0
  470. loop
  471.         CMPA.L  #NIL,A0
  472.         BEQ     callOld                 ; if list end, then call orig. Vec.
  473.         MOVE.L  vecListElem.wsp.bottom(A0),A3
  474.         MOVE.L  A3,A7
  475.         ADDA.L  vecListElem.wsp.length(A0),A7
  476.         MOVE.L  A0,-(A7)                ; Listenzeiger und alten Stack retten
  477.         MOVE.L  vecListElem.newVec(A0),A0
  478.         JSR     (A0)
  479.         MOVE.L  (A7)+,A0                ; Listenzeiger wieder herstellen
  480.         TST.W   -(A3)
  481.         BEQ     ready                   ; Rückgabe von FALSE => fertig!
  482.         MOVE.L  vecListElem.next(A0),A0 ; nächstes Listenelem.
  483.         BRA     loop
  484. callOld                                 ; A3 und A7 enthalten noch letzten wsp!
  485.         ; Zurück in Supervisormode
  486.         CLR.L   -(A7)
  487.         MOVE    #$20,-(A7)
  488.         TRAP    #1
  489.         ADDQ.L  #6, A7
  490.         
  491.         LEA     timerSArea,A0
  492.         ADDQ.L  #4,A0
  493.         MOVE.L  (A0)+,A1
  494.         MOVE.L  A1,USP                  ; stelle USP wieder her
  495.         MOVEM.L (A0)+,D0-D7/A1-A7       ; Stelle Regs wieder her
  496.         MOVE.L  timerSArea,A0
  497.         MOVE.L  orgTimerVec,-(A7)       ; Sprungaddresse auf den Stack
  498.         RTS
  499. ready                                   ; A3 und A7 enthalten noch letzten wsp!
  500.         ; Zurück in Supervisormode
  501.         CLR.L   -(A7)
  502.         MOVE    #$20,-(A7)
  503.         TRAP    #1
  504.         ADDQ.L  #6, A7
  505.         
  506.         LEA     timerSArea,A0
  507.         ADDQ.L  #4,A0
  508.         MOVE.L  (A0)+,A1
  509.         MOVE.L  A1,USP                  ; stelle USP wieder her
  510.         MOVEM.L (A0)+,D0-D7/A1-A7       ; Stelle Regs wieder her
  511.         MOVE.L  timerSArea,A0
  512.   END;
  513. END timerIRHandler;
  514.  
  515. (*  butChgIRHandler -- siehe 'timerIRHandler' *)
  516.  
  517. PROCEDURE butChgIRHandler;
  518.  
  519. BEGIN
  520.   ASSEMBLER
  521.         MOVE.L  A0,butChgSArea
  522.         LEA     butChgSArea,A0
  523.         ADDA.W  #68,A0
  524.         MOVEM.L D0-D7/A1-A7,-(A0)
  525.         MOVE.L  USP,A1
  526.         MOVE.L  A1,-(A0)                ; rette USP
  527.         ANDI    #-1-$2000,SR            ; Usermode
  528.         MOVE.L  butChgVecList,A0
  529.         MOVE.B  D0,butsTemp             ; speichere Buttonzustand(für VAR)
  530. loop
  531.         CMPA.L  #NIL,A0
  532.         BEQ     callOld                 ; if list end, then call orig. Vec.
  533.         MOVE.L  vecListElem.wsp.bottom(A0),A3
  534.         MOVE.L  A3,A7
  535.         ADDA.L  vecListElem.wsp.length(A0),A7
  536.         MOVEM.L D0/A0-A1,-(A7)          ; Listenzeiger und alten Stack retten
  537.         MOVE.L  vecListElem.newVec(A0),A0
  538.         MOVE.L  #butsTemp,(A3)+         ; Übergib 'VAR MButtonSet'
  539.         JSR     (A0)
  540.         MOVEM.L (A7)+,D0/A0-A1          ; Listenzeiger wieder herstellen
  541.         TST.W   -(A3)
  542.         BEQ     ready                   ; Rückgabe von FALSE => fertig!
  543.         MOVE.L  vecListElem.next(A0),A0 ; nächstes Listenelem.
  544.         BRA     loop
  545. callOld                                 ; A3 und A7 enthalten noch letzten wsp!
  546.         ; Zurück in Supervisormode
  547.         CLR.L   -(A7)
  548.         MOVE    #$20,-(A7)
  549.         TRAP    #1
  550.         ADDQ.L  #6, A7
  551.         
  552.         LEA     butChgSArea,A0
  553.         ADDQ.L  #4,A0
  554.         MOVE.L  (A0)+,A1
  555.         MOVE.L  A1,USP                  ; stelle USP wieder her
  556.         MOVEM.L (A0)+,D0-D7/A1-A7       ; Stelle Regs wieder her
  557.         MOVE.L  butChgSArea,A0
  558.         MOVE.B  butsTemp,D0
  559.         MOVE.L  orgButChgVec,-(A7)      ; Sprungaddresse auf den Stack
  560.         RTS
  561. ready                                   ; A3 und A7 enthalten noch letzten wsp!
  562.         ; Zurück in Supervisormode
  563.         CLR.L   -(A7)
  564.         MOVE    #$20,-(A7)
  565.         TRAP    #1
  566.         ADDQ.L  #6, A7
  567.         
  568.         LEA     butChgSArea,A0
  569.         ADDQ.L  #4,A0
  570.         MOVE.L  (A0)+,A1
  571.         MOVE.L  A1,USP                  ; stelle USP wieder her
  572.         MOVEM.L (A0)+,D0-D7/A1-A7       ; Stelle Regs wieder her
  573.         MOVE.L  butChgSArea,A0
  574.         MOVE.B  butsTemp,D0
  575.   END;
  576. END butChgIRHandler;
  577.  
  578. (*  msMoveIRHandler -- siehe 'timerIRHandler' *)
  579.  
  580. PROCEDURE msMoveIRHandler;
  581.  
  582. BEGIN
  583.   ASSEMBLER
  584.         MOVE.L  A0,msMoveSArea
  585.         LEA     msMoveSArea,A0
  586.         ADDA.W  #68,A0
  587.         MOVEM.L D0-D7/A1-A7,-(A0)
  588.         MOVE.L  USP,A1
  589.         MOVE.L  A1,-(A0)                ; rette USP
  590.         ANDI    #-1-$2000,SR            ; Usermode
  591.         MOVE.L  msMoveVecList,A0
  592.         LEA     locTemp,A1              ; temporärer x/y-Speicher(für VAR)
  593.         MOVE.W  D0,(A1)+
  594.         MOVE.W  D1,(A1)
  595. loop
  596.         CMPA.L  #NIL,A0
  597.         BEQ     callOld                 ; if list end, then call orig. Vec.
  598.         MOVE.L  vecListElem.wsp.bottom(A0),A3
  599.         MOVE.L  A3,A7
  600.         ADDA.L  vecListElem.wsp.length(A0),A7
  601.         MOVEM.L A0/A1,-(A7)             ; Listenzeiger und alten Stack retten
  602.         MOVE.L  vecListElem.newVec(A0),A0
  603.         MOVE.L  #locTemp,(A3)+          ; Übergib 'VAR Point'
  604.         JSR     (A0)
  605.         MOVEM.L (A7)+,A0/A1             ; Listenzeiger wieder herstellen
  606.         TST.W   -(A3)
  607.         BEQ     ready                   ; Rückgabe von FALSE => fertig!
  608.         MOVE.L  vecListElem.next(A0),A0 ; nächstes Listenelem.
  609.         BRA     loop
  610. callOld                                 ; A3 und A7 enthalten noch letzten wsp!
  611.         ; Zurück in Supervisormode
  612.         CLR.L   -(A7)
  613.         MOVE    #$20,-(A7)
  614.         TRAP    #1
  615.         ADDQ.L  #6, A7
  616.         
  617.         LEA     msMoveSArea,A0
  618.         ADDQ.L  #4,A0
  619.         MOVE.L  (A0)+,A1
  620.         MOVE.L  A1,USP                  ; stelle USP wieder her
  621.         MOVEM.L (A0)+,D0-D7/A1-A7       ; Stelle Regs wieder her
  622.         LEA     locTemp,A0
  623.         MOVE.W  (A0)+,D0
  624.         MOVE.W  (A0),D1
  625.         MOVE.L  msMoveSArea,A0
  626.         MOVE.L  orgMsMoveVec,-(A7)      ; Sprungaddresse auf den Stack
  627.         RTS
  628. ready                                   ; A3 und A7 enthalten noch letzten wsp!
  629.         ; Zurück in Supervisormode
  630.         CLR.L   -(A7)
  631.         MOVE    #$20,-(A7)
  632.         TRAP    #1
  633.         ADDQ.L  #6, A7
  634.         
  635.         LEA     msMoveSArea,A0
  636.         ADDQ.L  #4,A0
  637.         MOVE.L  (A0)+,A1
  638.         MOVE.L  A1,USP                  ; stelle USP wieder her
  639.         MOVEM.L (A0)+,D0-D7/A1-A7       ; Stelle Regs wieder her
  640.         LEA     locTemp,A0
  641.         MOVE.W  (A0)+,D0
  642.         MOVE.W  (A0),D1
  643.         MOVE.L  msMoveSArea,A0
  644.   END;
  645. END msMoveIRHandler;
  646.  
  647. (*  CurChgIRHandler -- siehe 'timerIRHandler' *)
  648.  
  649. PROCEDURE curChgIRHandler;
  650.  
  651. BEGIN
  652.   ASSEMBLER
  653.         MOVE.L  A0,curChgSArea
  654.         LEA     curChgSArea,A0
  655.         ADDA.W  #68,A0
  656.         MOVEM.L D0-D7/A1-A7,-(A0)
  657.         MOVE.L  USP,A1
  658.         MOVE.L  A1,-(A0)                ; rette USP
  659.         ANDI    #-1-$2000,SR            ; Usermode
  660.         MOVE.L  curChgVecList,A0
  661.         LEA     locTemp2,A1             ; temporärer x/y-Speicher(für VAR)
  662.         MOVE.W  D0,(A1)+
  663.         MOVE.W  D1,(A1)
  664. loop
  665.         CMPA.L  #NIL,A0
  666.         BEQ     callOld                 ; if list end, then call orig. Vec.
  667.         MOVE.L  vecListElem.wsp.bottom(A0),A3
  668.         MOVE.L  A3,A7
  669.         ADDA.L  vecListElem.wsp.length(A0),A7
  670.         MOVEM.L A0/A1,-(A7)             ; Listenzeiger und alten Stack retten
  671.         MOVE.L  vecListElem.newVec(A0),A0
  672.         MOVE.L  #locTemp2,(A3)+         ; Übergib 'VAR Point'
  673.         JSR     (A0)
  674.         MOVEM.L (A7)+,A0/A1             ; Listenzeiger wieder herstellen
  675.         TST.W   -(A3)
  676.         BEQ     ready                   ; Rückgabe von FALSE => fertig!
  677.         MOVE.L  vecListElem.next(A0),A0 ; nächstes Listenelem.
  678.         BRA     loop
  679. callOld                                 ; A3 und A7 enthalten noch letzten wsp!
  680.         ; Zurück in Supervisormode
  681.         CLR.L   -(A7)
  682.         MOVE    #$20,-(A7)
  683.         TRAP    #1
  684.         ADDQ.L  #6, A7
  685.         
  686.         LEA     curChgSArea,A0
  687.         ADDQ.L  #4,A0
  688.         MOVE.L  (A0)+,A1
  689.         MOVE.L  A1,USP                  ; stelle USP wieder her
  690.         MOVEM.L (A0)+,D0-D7/A1-A7       ; Stelle Regs wieder her
  691.         LEA     locTemp2,A0             ; geänderte location übergeben
  692.         MOVE.W  (A0)+,D0
  693.         MOVE.W  (A0),D1
  694.         MOVE.L  curChgSArea,A0
  695.         MOVE.L  orgCurChgVec,-(A7)      ; Sprungaddresse auf den Stack
  696.         RTS
  697. ready                                   ; A3 und A7 enthalten noch letzten wsp!
  698.         ; Zurück in Supervisormode
  699.         CLR.L   -(A7)
  700.         MOVE    #$20,-(A7)
  701.         TRAP    #1
  702.         ADDQ.L  #6, A7
  703.         
  704.         LEA     curChgSArea,A0
  705.         ADDQ.L  #4,A0
  706.         MOVE.L  (A0)+,A1
  707.         MOVE.L  A1,USP                  ; stelle USP wieder her
  708.         MOVEM.L (A0)+,D0-D7/A1-A7       ; Stelle Regs wieder her
  709.         LEA     locTemp2,A0             ; geänderte location übergeben
  710.         MOVE.W  (A0)+,D0
  711.         MOVE.W  (A0),D1
  712.         MOVE.L  curChgSArea,A0
  713.   END;
  714. END curChgIRHandler;
  715.  
  716. PROCEDURE InstallTimerProc(VAR hdl:TimerVecCarrier;newVector:TimerVecProc;
  717.                            wsp:MemArea;VAR deltaTime:CARDINAL);
  718.                          
  719. BEGIN
  720.   ASSEMBLER
  721.         MOVE.L  our_cb,A0
  722.         
  723.         LEA     cb.SUPERVISION(A0),A0
  724.         TST.W   superData.timerChgd(A0)
  725.         BNE     cont            ; bra, if not first timerVec in this level
  726.         MOVE.W  #1,superData.timerChgd(A0)
  727.         MOVE.L  timerVecList,superData.timerPrev(A0)
  728. cont
  729.  
  730.         MOVE.L  timerVecList,D0 ; Hole Zeiger auf Listenanfang
  731.         BNE     anotherVec      ; springe, falls schon Vec's vorhanden
  732.         
  733.                           ; Anmeldung beim VDI
  734.         MOVE.L  #timerIRHandler,(A3)+
  735.         MOVE.L  #deltaT,(A3)+
  736.         JSR     exchangeTimerVec
  737.         MOVE.L  -(A3),orgTimerVec
  738.         
  739. anotherVec                ; Userroutine einketten
  740.         MOVE.L  -(A3),A0        ; Param. vom A3-Stack holen
  741.         MOVE.L  -(A3),D0
  742.         MOVE.L  -(A3),D1
  743.         MOVE.L  -(A3),D2
  744.         MOVE.L  -(A3),A1
  745.         MOVE.L  D1,vecListElem.wsp.bottom(A1)   ; save workspace
  746.         MOVE.L  D0,vecListElem.wsp.length(A1)
  747.         MOVE.L  D2,vecListElem.newVec(A1)       ; save 'newVector'
  748.         MOVE.L  timerVecList,vecListElem.next(A1) ; einketten
  749.         MOVE.L  A1,timerVecList
  750.         MOVE.W  deltaT,(A0)                     ; Zeitabstand übergeben
  751.   END;
  752. END InstallTimerProc;
  753.  
  754. PROCEDURE RemoveTimerProc(VAR hdl:TimerVecCarrier);
  755.  
  756. BEGIN
  757.   ASSEMBLER
  758.         JMP     removeTimerVector
  759.   END;
  760. END RemoveTimerProc;
  761.  
  762. PROCEDURE InstallButChgProc(VAR hdl:ButChgVecCarrier;newVector:ButChgVecProc;
  763.                             wsp:MemArea);
  764.  
  765. BEGIN
  766.   ASSEMBLER
  767.         MOVE.L  our_cb,A0
  768.         
  769.         LEA     cb.SUPERVISION(A0),A0
  770.         TST.W   superData.butChgChgd(A0)
  771.         BNE     cont            ; bra, if not first butChgVec in this level
  772.         MOVE.W  #1,superData.butChgChgd(A0)
  773.         MOVE.L  butChgVecList,superData.butChgPrev(A0)
  774. cont
  775.  
  776.         MOVE.L  butChgVecList,D0 ; Hole Zeiger auf Listenanfang
  777.         BNE     anotherVec       ; springe, falls schon Vec's vorhanden
  778.         
  779.                            ; Anmeldung beim VDI
  780.         MOVE.W  #EX_BUT_CHANGE,(A3)+
  781.         MOVE.L  #butChgIRHandler,(A3)+
  782.         JSR     exchangeMouseVec        ; exchangeMV(EX_BUT_CHANGE,butChgIR..)
  783.         MOVE.L  -(A3),orgButChgVec
  784.         
  785. anotherVec                 ; Userroutine einketten
  786.         MOVE.L  -(A3),D0                ; Hole Param. vom Stack
  787.         MOVE.L  -(A3),D1
  788.         MOVE.L  -(A3),D2
  789.         MOVE.L  -(A3),A1
  790.         MOVE.L  D1,vecListElem.wsp.bottom(A1)   ; save workspace
  791.         MOVE.L  D0,vecListElem.wsp.length(A1)
  792.         MOVE.L  D2,vecListElem.newVec(A1)       ; save 'newVector'
  793.         MOVE.L  butChgVecList,vecListElem.next(A1) ; einketten
  794.         MOVE.L  A1,butChgVecList
  795.   END;
  796. END InstallButChgProc;
  797.  
  798. PROCEDURE RemoveButChgProc(VAR hdl:ButChgVecCarrier);
  799.  
  800. BEGIN
  801.   ASSEMBLER
  802.         JMP     removeButChgVector
  803.   END;
  804. END RemoveButChgProc;
  805.  
  806. PROCEDURE InstallMsMoveProc(VAR hdl:MsMoveVecCarrier;newVector:MsMoveVecProc;
  807.                             wsp:MemArea);
  808.  
  809. BEGIN
  810.   ASSEMBLER
  811.         MOVE.L  our_cb,A0
  812.         
  813.         LEA     cb.SUPERVISION(A0),A0
  814.         TST.W   superData.msMoveChgd(A0)
  815.         BNE     cont            ; bra, if not first msMoveVec in this level
  816.         MOVE.W  #1,superData.msMoveChgd(A0)
  817.         MOVE.L  msMoveVecList,superData.msMovePrev(A0)
  818. cont
  819.  
  820.         MOVE.L  msMoveVecList,D0 ; Hole Zeiger auf Listenanfang
  821.         BNE     anotherVec       ; springe, falls schon Vec's vorhanden
  822.                 
  823.                            ; Anmeldung beim VDI
  824.         MOVE.W  #EX_MOUSE_MOVE,(A3)+
  825.         MOVE.L  #msMoveIRHandler,(A3)+
  826.         JSR     exchangeMouseVec
  827.         MOVE.L  -(A3),orgMsMoveVec
  828.         
  829. anotherVec                 ; Userroutine einketten
  830.         MOVE.L  -(A3),D0                ; Hole Param. vom Stack
  831.         MOVE.L  -(A3),D1
  832.         MOVE.L  -(A3),D2
  833.         MOVE.L  -(A3),A1
  834.         MOVE.L  D1,vecListElem.wsp.bottom(A1)   ; save workspace
  835.         MOVE.L  D0,vecListElem.wsp.length(A1)
  836.         MOVE.L  D2,vecListElem.newVec(A1)       ; save 'newVector'
  837.         MOVE.L  msMoveVecList,vecListElem.next(A1) ; einketten
  838.         MOVE.L  A1,msMoveVecList
  839.   END;
  840. END InstallMsMoveProc;
  841.  
  842. PROCEDURE RemoveMsMoveProc(VAR hdl:MsMoveVecCarrier);
  843.  
  844. BEGIN
  845.   ASSEMBLER
  846.         JMP     removeMsMoveVector
  847.   END;
  848. END RemoveMsMoveProc;
  849.  
  850. PROCEDURE InstallCurChgProc(VAR hdl:CurChgVecCarrier;newVector:CurChgVecProc;
  851.                             wsp:MemArea);
  852.                           
  853. BEGIN
  854.   ASSEMBLER
  855.         MOVE.L  our_cb,A0
  856.         
  857.         LEA     cb.SUPERVISION(A0),A0
  858.         TST.W   superData.curChgChgd(A0)
  859.         BNE     cont            ; bra, if not first curChgVec in this level
  860.         MOVE.W  #1,superData.curChgChgd(A0)
  861.         MOVE.L  curChgVecList,superData.curChgPrev(A0)
  862. cont
  863.  
  864.         MOVE.L  curChgVecList,D0 ; Hole Zeiger auf Listenanfang
  865.         BNE     anotherVec       ; springe, falls schon Vec's vorhanden
  866.                 
  867.                            ; Anmeldung beim VDI
  868.         MOVE.W  #EX_MOUSE_CHANGE,(A3)+
  869.         MOVE.L  #curChgIRHandler,(A3)+
  870.         JSR     exchangeMouseVec
  871.         MOVE.L  -(A3),orgCurChgVec
  872.         
  873. anotherVec                 ; Userroutine einketten
  874.         MOVE.L  -(A3),D0                ; Hole Param. vom Stack
  875.         MOVE.L  -(A3),D1
  876.         MOVE.L  -(A3),D2
  877.         MOVE.L  -(A3),A1
  878.         MOVE.L  D1,vecListElem.wsp.bottom(A1)   ; save workspace
  879.         MOVE.L  D0,vecListElem.wsp.length(A1)
  880.         MOVE.L  D2,vecListElem.newVec(A1)       ; save 'newVector'
  881.         MOVE.L  curChgVecList,vecListElem.next(A1) ; einketten
  882.         MOVE.L  A1,curChgVecList
  883.   END;
  884. END InstallCurChgProc;
  885.  
  886. PROCEDURE RemoveCurChgProc(VAR hdl:CurChgVecCarrier);
  887.  
  888. BEGIN
  889.   ASSEMBLER
  890.         JMP     removeCurChgVector
  891.   END;
  892. END RemoveCurChgProc;
  893.  
  894.  
  895. BEGIN
  896.   timerVecList:=NIL; butChgVecList:=NIL;  (* Vektorlisten initialisieren *)
  897.   msMoveVecList:=NIL; curChgVecList:=NIL;
  898. END VDIInputs.